import java.lang.instrument.ClassFileTransformer;
import java.lang.instrument.IllegalClassFormatException;
import java.lang.instrument.Instrumentation;
import java.security.ProtectionDomain;
import com.google.common.base.Function;
import com.google.common.collect.FluentIterable;
import com.google.common.collect.ImmutableListMultimap;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;
public class Agent {
private static Instrumentation inst;
public static void premain(final String agentArgs, Instrumentation inst){
Agent.inst = inst;
System.out.printf("premain called");
inst.addTransformer(new ClassFileTransformer() {
public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException {
ClassPool cp = ClassPool.getDefault();
try {
if(className.equals("Application")){
final CtClass ctClass = cp.get("Application");
final CtMethod ctMethod = ctClass.getDeclaredMethod("hello");
ctMethod.insertBefore("return \"Bye\";");
classfileBuffer = ctClass.toBytecode();
ctClass.detach();
}
} catch (Exception e) {
e.printStackTrace();
}
return classfileBuffer;
}
});
}
public static void packagesClasses(){
final ImmutableListMultimap<String, Class> index = FluentIterable.of(inst.getAllLoadedClasses()).index(new Function<Class, String>() {
public String apply(Class input) {
return input.getPackage().getName();
}
});
}
}